//package ui;
//
//import java.awt.Canvas;
//import java.awt.Color;
//import java.awt.Font;
//import java.awt.FontMetrics;
//import java.awt.Graphics;
//import java.awt.Image;
//import java.awt.Rectangle;
//import java.awt.image.ImageObserver;
//
//public final class GraphViewIsingModel  {
//		  Ising is;
//		  int n;
//		  public int[] Panxy;
//		  public double dx, dy, dxy;
//		  public int wh;
//		  Rectangle Rect;
//		  Image img, HamiltonImg, MagnetizationImg;
//		  Graphics imgGra;
//		  public IsingFever Hamilton, Magnetization;
//		  boolean GridForbidden=false;
//		  public boolean GridFlag=true;
//		  boolean ThermoFlag=true, sigmaFlag=true, FeverFlag=true, TimeFlag=true;
//		  public boolean SpinsDrawn=false;
//		  short[] Spin;
//		  public int[] Tempxy=new int[4];
//		  public int[] TempCritxy=new int[4];
//		  
//		  public IsingCanvas(Ising is, int[] Panxy) {
//		    this.is=is;
//		    n=is.n;
//		    this.Panxy=Panxy;
//		    Hamilton=new IsingFever("Energy per spin",(int)(0.8*Panxy[2]));
//		    Magnetization=new IsingFever("Magnetization",(int)(0.8*Panxy[2]));
//		    Spin=new short[is.lattice.nind];
//		  }
//
//		  public void init() {
//		    Hamilton.init(is.lattice.Hamilton(is.lattice.t),
//		  	  is.lattice.HamiltonMin(),is.lattice.HamiltonMax());
//		//  -2,2);
//		    Magnetization.init(is.lattice.Magnetization(is.lattice.t),-1,1);
//		    SpinsDrawn=false;
//		  }
//
//		  public void reset() {
//		    init();
//		    Hamilton.initGraphics(this,
//					  createImage(Hamilton.width,
//						      Hamilton.height),
//					  Hamilton.color);
//		    Magnetization.initGraphics(this,
//					       createImage(Magnetization.width,
//							   Magnetization.height),
//					       Magnetization.color);
//		    SpinsDrawn=false;
//		  }
//
//		  public void setGridFlag(boolean GridFlag) {
//		    if (!GridForbidden) {
//		      this.GridFlag=GridFlag;
//		      if (GridFlag) {
//			img.flush();
//			img=createImage(wh+1,wh+1);
//			imgGra=img.getGraphics();
//			paintGrid(imgGra);
//		      }
//		      else {
//			img.flush();
//			img=createImage(wh,wh);
//			imgGra=img.getGraphics();
//		      }
//		    }
//		    SpinsDrawn=false;
//		  }
//		  
//		  public void plot(int x, int y, short value) {
//		    if (x >= 0 && x < n && y >=0 && y < n) {
//		      Spin[x+n*y]=is.lattice.sigma[is.lattice.t][x+n*y]=value;
//		      imgGra.setColor(Color.blue);
//		      if (GridFlag)
//			if (value > 0)
//			  imgGra.fillRect((int)(x*dxy)+1,(int)(y*dxy)+1,
//					  (int)dxy-1,(int)dxy-1);
//			  else
//			    imgGra.clearRect((int)(x*dxy)+1,(int)(y*dxy)+1,
//					     (int)dxy-1,(int)dxy-1);
//		      else
//			if (value > 0)
//			  imgGra.fillRect((int)(x*dxy),(int)(y*dxy),
//					  (int)dxy,(int)dxy);
//			else
//			  imgGra.clearRect((int)(x*dxy),(int)(y*dxy),
//					   (int)dxy,(int)dxy);
//		    }
//		  }
//
//		  private void drawSpins() {
//		    int i, j, t, pos=0;
//		    
//		    imgGra.setColor(Color.blue);
//		    t=is.lattice.t;
//		    
//		    if (GridFlag)
//		      if (!SpinsDrawn)
//			for (j=0; j<n; ++j)
//			  for (i=0; i<n; ++i)
//			    if (is.lattice.sigma[t][pos++] > 0)
//			      imgGra.fillRect((int)(i*dxy)+1,(int)(j*dxy)+1,
//					      (int)dxy-1,(int)dxy-1);
//			    else
//			      imgGra.clearRect((int)(i*dxy)+1,(int)(j*dxy)+1,
//					       (int)dxy-1,(int)dxy-1);
//		      else
//			for (j=0; j<n; ++j)
//			  for (i=0; i<n; ++i) {
//			    if (is.lattice.sigma[t][pos] != Spin[pos])
//			      if (is.lattice.sigma[t][pos] > 0)
//				imgGra.fillRect((int)(i*dxy)+1,(int)(j*dxy)+1,
//					      (int)dxy-1,(int)dxy-1);
//			      else
//				imgGra.clearRect((int)(i*dxy)+1,(int)(j*dxy)+1,
//						 (int)dxy-1,(int)dxy-1);
//			    ++pos;
//			  }
//		    else {
//		      imgGra.clearRect(0,0,wh+1,wh+1);
//		      for (j=0; j<n; ++j)
//			for (i=0; i<n; ++i)
//			  if (is.lattice.sigma[t][pos++] > 0)
//			    imgGra.fillRect((int)(i*dxy),(int)(j*dxy),
//					    (int)dxy,(int)dxy);
//		    }
//		    Spin=is.lattice.sigma[t];
//		    SpinsDrawn=true;
//		  }
//		  
//		  private void paintGrid(Graphics g) {
//		    int i;
//
//		    g.setColor(Color.black);
//		    for (i=0; i<=n; i++) {
//		      g.drawLine(0,(int)(i*dxy),wh,(int)(i*dxy));
//		      g.drawLine((int)(i*dxy),0,(int)(i*dxy),wh);
//		    }
//		  }
//
//		  /* Thermometer zeichnen */
//		  private void paintThermo(Graphics g) {
//		    double x,y,r1,r2,h;
//		    double factor=Math.PI/180;
//		    int x0,y0,x1,y1,h0,alpha,gamma;
//
//		    r1=0.1*Panxy[0];
//		    r2=0.05*Panxy[0];
//		    h=0.8*wh;
//		    x=Panxy[0]/2;
//		    y=Panxy[1]+wh-(wh-(h+r1+r2))/2;
//
//		    Tempxy[0]=(int)(x-r2);             // Koordinaten des Steuerbereichs
//		    Tempxy[1]=(int)(y-h);              // des Thermometers festlegen
//		    Tempxy[2]=(int)(x+r2);
//		    Tempxy[3]=(int)y;
//
//		    alpha=90+(int)(Math.asin(r2/r1)/factor);
//		    gamma=360-2*(alpha-90);
//		    x0=(int)(x-r1);
//		    y0=(int)(y-(r1-r1*Math.cos(factor*(alpha-90))));
//		    g.setColor(Color.red);
//		    g.fillArc(x0,y0,(int)(2*r1),(int)(2*r1),alpha,gamma);
//		    g.setColor(Color.black);
//		    g.drawArc(x0,y0,(int)(2*r1),(int)(2*r1),alpha,gamma);
//		    x0=(int)(x-r2);
//		    y0=(int)(y-h*is.lattice.Temp/is.lattice.TempMax);
//		    h0=(int)(h*is.lattice.Temp/is.lattice.TempMax+
//			     r1*Math.cos(factor*(alpha-90)));
//		    g.setColor(Color.red);
//		    g.fillRect(x0,y0,(int)(2*r2),h0);
//		    y0=(int)(y-h);
//		    h0=(int)(h-h*is.lattice.Temp/is.lattice.TempMax);
//		    g.setColor(Color.lightGray);
//		    g.fillRect(x0,y0,(int)(2*r2),h0);
//		    g.setColor(Color.black);
//		    g.drawLine(x0,y0,x0,(int)(y0+h));
//		    g.drawLine(x0+(int)(2*r2),y0,x0+(int)(2*r2),(int)(y0+h));
//		    y0=(int)(y-h-r2);
//		    g.setColor(Color.lightGray);
//		    g.fillArc(x0,y0,(int)(2*r2),(int)(2*r2),0,180);
//		    g.setColor(Color.black);
//		    g.drawArc(x0,y0,(int)(2*r2),(int)(2*r2),0,180);
//		  }
//
//		  private void drawTitle(Graphics g, String s, int x, int y, int fs) {
//		    int red, green, blue;
//		    Font f;
//		    FontMetrics fm;
//		    int i;
//		    String subs;
//		    
//		    red=(int)(Math.random()*150);
//		    green=(int)(Math.random()*100);
//		    blue=(int)(Math.random()*50);
//		    f=new Font("TimesRoman",Font.ITALIC,fs);
//		    g.setFont(f);
//		    fm=g.getFontMetrics();
//		    y+=f.getSize();
//
//		    for (i=0; i<s.length(); i++) {
//		      subs=s.substring(i,i+1);
//		      g.setColor(new Color((red+x/2)%256,(green+x)%256,(blue+x/4)%256));
//		      g.drawString(subs,x,y);
//		      x+=fm.stringWidth(subs);
//		    }
//		  }
//
//		  private void drawTime(Graphics g) {
//		    Font f;
//		    FontMetrics fm;
//		    String s="t="+new Integer(is.t).toString();
//		    int x, y;
//		    
//		    f=new Font("TimesRoman",Font.PLAIN,17);
//		    g.setFont(f);
//		    fm=g.getFontMetrics();
//		    x=Panxy[0]+(wh-fm.stringWidth(s))/2;
//		    y=Panxy[1]-4;
//		    g.setColor(Color.black);
//		    g.clearRect(Panxy[0],Panxy[1]-f.getSize()-4,wh,f.getSize());
//		    g.drawString(s,x,y);
//		  }
//		  
//		  private void drawTempCrit(Graphics g) {
//		    Font f;
//		    FontMetrics fm;
//		    int x, y;
//		    String s1="T", s2="Crit";
//		    
//		    f=new Font("TimesRoman",Font.PLAIN,17);
//		    g.setFont(f);
//		    fm=g.getFontMetrics();
//		    x=Tempxy[2]+6;
//		    y=Tempxy[3]-
//		      (int)(is.lattice.TempCrit/(is.lattice.TempMax-is.lattice.TempMin)*
//			    (Tempxy[3]-Tempxy[1]));
//
//		    TempCritxy[0]=Tempxy[2];
//		    TempCritxy[1]=y-f.getSize()/2;
//		    g.setColor(new Color(127,0,127));
//		    g.drawLine(Tempxy[2]+1,y,Tempxy[2]+4,y);
//		    y+=f.getSize()/2;
//		    g.drawString(s1,x,y);
//		    x+=fm.stringWidth(s1);
//		    f=new Font("TimesRoman",Font.PLAIN,12);
//		    g.setFont(f);
//		    fm=g.getFontMetrics();
//		    y+=f.getSize()/2;
//		    g.drawString(s2,x,y);
//		    x+=fm.stringWidth(s2);
//		    TempCritxy[2]=x;
//		    TempCritxy[3]=y;
//		  }
//
//		  public void paint(Graphics g) {
//		    Rect=bounds();
//		    dx=(Rect.width-Panxy[0]-Panxy[2])/n;
//		    dy=(Rect.height-Panxy[1]-Panxy[3])/n;
//		    dxy=(dx <= dy) ? dx : dy;
//		    wh=(int)(n*dxy);
//		    if (dxy<=2) {
//		      GridForbidden=true;
//		      GridFlag=false;
//		    }    
//		    
//		    if (GridFlag) {
//		      img=createImage(wh+1,wh+1);
//		      imgGra=img.getGraphics();
//		      paintGrid(imgGra);
//		    }
//		    else {
//		      img=createImage(wh,wh);
//		      imgGra=img.getGraphics();
//		    }
//
//		    Hamilton.initGraphics(this,
//					  createImage(Hamilton.n,(int)(0.9*wh/2)),
//					  Color.red);
//		    Magnetization.initGraphics(this,
//					       createImage(Magnetization.n,(int)(0.9*wh/2)),
//					       Color.cyan);
//
//		    SpinsDrawn=false;
//		    drawSpins();
//		    paintThermo(g);
//		    drawTempCrit(g);
//		//   drawTitle(g,"Simple Ising Model  v1.0",
////		      Panxy[0],(int)(0.05*Panxy[1]),(int)(0.4*Panxy[1]));
//		    drawTime(g);
//		    g.drawImage(img,Panxy[0],Panxy[1],this);
//		    g.drawImage(Hamilton.img,
//				Panxy[0]+wh+(int)(0.2*Panxy[2]),Panxy[1],
//				this);
//		    g.drawImage(Magnetization.img,
//				Panxy[0]+wh+(int)(0.2*Panxy[2]),Panxy[1]+wh/2,
//				this);
//		    Hamilton.drawParams(g,Panxy[0]+wh+(int)(0.2*Panxy[2]),Panxy[1]);
//		    Magnetization.drawParams(g,Panxy[0]+wh+(int)(0.2*Panxy[2]),Panxy[1]+wh/2);
//		  }
//
//		  public void update(Graphics g) {     // Weg mit dem Flackern!!!
//		    if (ThermoFlag || !is.stopped)
//		      paintThermo(g);
//		    if (sigmaFlag || !is.stopped) {
//		      drawSpins();
//		      img.flush();
//		      g.drawImage(img,Panxy[0],Panxy[1],this);
//		    }
//		    if (TimeFlag || !is.stopped)
//		      drawTime(g);
//		    if (FeverFlag || !is.stopped) {
//		      Hamilton.img.flush();
//		      g.drawImage(Hamilton.img,
//				  Panxy[0]+wh+(int)(0.2*Panxy[2]),Panxy[1],
//				  this);
//		      Magnetization.img.flush();
//		      g.drawImage(Magnetization.img,
//				  Panxy[0]+wh+(int)(0.2*Panxy[2]),Panxy[1]+wh/2,
//				  this);
//		    }
//		  }
//
//		  public synchronized void redraw(boolean ThermoFlag,
//						  boolean sigmaFlag,
//						  boolean FeverFlag,
//						  boolean TimeFlag) {
//		    this.ThermoFlag=ThermoFlag;
//		    this.sigmaFlag=sigmaFlag;
//		    this.FeverFlag=FeverFlag;
//		    this.TimeFlag=TimeFlag;
//		    
//		    repaint();
//		  }
//}
